﻿
namespace SistemaLogistica.Windows.Forms.Transporte.Operaciones
{
    using System;
    using System.Windows.Forms;
    using EDOSwit.Controls.Helpers;
    using EDOSwit.Controls.Types;
    using EDOSwit.Controls.UserControls;
    using SistemaLogistica.Business.Entities;
    using SistemaLogistica.Business.Entities.Types;
    using SistemaLogistica.Business.Logic;
    using SistemaLogistica.Windows.Helpers;

    public partial class CwfMantenimiento : MantenedorSeguro, Observador
    {
        public CwfMantenimiento()
        {
            InitializeComponent();
        }

        protected override void LoadPermisos()
        {
            this.TsMenu.Permisos.AddRange(Metodos.GetPermisos(Convert.ToByte(this.Tag)));
        }

        protected override void FocusKeyPress(object sender, KeyPressEventArgs e)
        {
            base.FocusKeyPress(sender, e);
        }

        protected override void InitialLoad()
        {
            try
            {
                LoadVehiculos();
                this.cmbEstado.DataSource = Enum.GetNames(typeof(DisponibilidadType));           
                this.MantenedorBindingSource.DataSource = MantenimientoManager.Instancia.Listar();
                this.dgvMantenedor.DataSource = this.MantenedorBindingSource;
                OcultarColumnas();
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.TituloMensaje, ex.Message);
            }
        }

        private void LoadVehiculos()
        {
            this.cmbVehiculo.DisplayMember = "NroPlaca";
            this.cmbVehiculo.ValueMember = "IdBien";
            this.cmbVehiculo.DisplayColumnNames = "IdBien, NroPlaca, Modelo, Marca, Tipo";
            this.cmbVehiculo.DataSource = VehiculoManager.Instancia.Listar();
        }

        private void OcultarColumnas()
        {
            this.dgvMantenedor.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            this.dgvMantenedor.Columns["IdMantenimiento"].Visible = false;
            this.dgvMantenedor.Columns["Descripcion"].Visible = false;
            this.dgvMantenedor.Columns["Estado"].Visible = false;
            this.dgvMantenedor.Columns["Vehiculo"].DisplayIndex = 0;
            this.dgvMantenedor.Columns["NombreEstado"].DisplayIndex = 3;
            this.dgvMantenedor.Columns["NombreEstado"].HeaderText = "Estado";
        }

        protected override void LoadData(object obj)
        {
            Mantenimiento mantenimiento = obj as Mantenimiento;
            if (mantenimiento != null)
            {
                this.identificador = mantenimiento.IdMantenimiento;
                this.cmbVehiculo.SelectedValue = mantenimiento.Vehiculo.IdBien;
                this.dtpFechaIngreso.Value = mantenimiento.FechaIngreso;
                this.dtpFechaEntrega.Value = mantenimiento.FechaEntrega;
                this.txtDescripcion.Text = mantenimiento.Descripcion;
                this.cmbEstado.SelectedIndex = mantenimiento.Estado;
            }
        }

        protected override void EventoNuevo()
        {
            this.dtpFechaIngreso.Value = EmpresaManager.Instancia.Fecha();
            this.cmbVehiculo.Focus();
        }

        protected override void EventoEditar()
        {
            this.cmbVehiculo.Focus();
        }

        protected override void BuscarData()
        {
            try
            {
                this.MantenedorBindingSource.DataSource = MantenimientoManager.Instancia.Buscar(this.txtBuscar.Text);
                this.dgvMantenedor.DataSource = this.MantenedorBindingSource;
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.TituloMensaje, ex.Message);
            }
        }

        protected override bool SaveData()
        {
            bool result = false;
            int posicion = this.MantenedorBindingSource.Position;
            try
            {
                switch (this.estadoActual)
                {
                    case EstadoActual.Nuevo:
                        MantenimientoManager.Instancia.Registrar(GetMantenimiento());
                        break;
                    case EstadoActual.Editar:
                        MantenimientoManager.Instancia.Modificar(GetMantenimiento());
                        break;
                    case EstadoActual.Eliminar:
                        MantenimientoManager.Instancia.Eliminar(Convert.ToInt32(this.identificador), Convert.ToInt32(this.cmbVehiculo.SelectedValue));
                        posicion -= 1;
                        break;
                    default:
                        break;
                }

                result = true;
                InitialLoad();
                this.MantenedorBindingSource.Position = posicion;
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.TituloMensaje, ex.Message);
            }
            return result;
        }

        private Mantenimiento GetMantenimiento()
        {
            return new Mantenimiento
            {
                IdMantenimiento = Convert.ToInt32(this.identificador),
                FechaIngreso = this.dtpFechaIngreso.Value,
                FechaEntrega = this.dtpFechaEntrega.Value,
                Estado = this.cmbEstado.SelectedIndex,
                Descripcion = this.txtDescripcion.Text,
                Vehiculo = new Vehiculo { IdBien = Convert.ToInt32(this.cmbVehiculo.SelectedValue) }
            };
        }

        protected override bool ValidateData()
        {
            bool result = true;

            if (this.cmbVehiculo.SelectedIndex == -1)
            {
                this.errValidator.SetError(this.cmbVehiculo, "Seleccionar Vehiculo.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.cmbVehiculo, string.Empty);
            }
            if (this.cmbEstado.SelectedIndex == -1)
            {
                this.errValidator.SetError(this.cmbEstado, "Seleccionar Estado.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.cmbEstado, string.Empty);
            }
            if (string.IsNullOrEmpty(this.txtDescripcion.Text))
            {
                this.errValidator.SetError(this.txtDescripcion, "Ingresar Datos para reparación.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.txtDescripcion, string.Empty);
            }

            return result;
        }

        protected override void ClearControls()
        {
            this.identificador = 0;
            base.ClearControls();
        }

        #region Miembros de Observador

        public void Notificar(object mensaje)
        {
            LoadVehiculos();
        }

        #endregion
    }
}
